# coding: UTF-8
"""
缩写说明：
VAR_：变量（Variables）
INS_：类的实例化（Instantiation）
ATR_：类属性（Attributes）
MET_：类方法（Method Objects）
FP_：函数的形式参数（）
LV_：循环变量（Loop Variable）
"""
# 【标准库与第三方库】
import pygame
# 【自定义模块】
from settings import Settings
import game_function as gf
from game_stats import GameStats
from info_board import Scoreboard
from ship import Ship
# from weapon import Bullet
# from enemy import Enemy
from pygame.sprite import Group
from button import Button


def start_game() -> None:
    """【函 数】
    """
    # 初始化游戏，并创建一个屏幕对象
    pygame.init()
    INS_settings = Settings()
    INS_screen = pygame.display.set_mode((INS_settings.screen_width, INS_settings.screen_height))
    pygame.display.set_caption("Alien Invasion")

    # 创建开始按钮
    INS_play_button = Button(INS_settings, INS_screen, "Play")

    # 创建一个用于存储游戏统计信息的实例、一个记分板
    INS_stats = GameStats(INS_settings)
    INS_score = Scoreboard(INS_settings, INS_screen, INS_stats)

    # 创建一艘飞船、一个子弹编组、一个敌机编组
    INS_ship = Ship(INS_settings, INS_screen)   # 飞船
    INS_bullets_group = Group()   # 子弹编组，如果在循环内创建编组会导致编组不断被创建
    # INS_enemy = Enemy(INS_settings, INS_screen)   # 显示一只敌机
    INS_enemy_group = Group()   # 敌机编组
    gf.create_enemy_fleet(INS_settings, INS_screen, INS_ship, INS_enemy_group)


    # 开始游戏的主循环
    while (True):
        # 监视键盘和鼠标事件
        gf.check_event(INS_settings, INS_screen, INS_stats, INS_score, INS_ship, INS_bullets_group, INS_enemy_group, INS_play_button)
        
        if (INS_stats.ATR_game_active):
            # 更新飞船的位置
            INS_ship.MET_update()
            # 更新子弹的位置
            gf.update_bullet(INS_settings, INS_screen, INS_stats, INS_score, INS_ship, INS_bullets_group, INS_enemy_group)
            # 更新敌机的位置
            gf.update_enemy_group(INS_settings, INS_stats, INS_screen, INS_score, INS_ship, INS_bullets_group, INS_enemy_group)
        
        # 更新重绘屏幕，并使屏幕可见
        gf.update_screen(INS_settings, INS_screen, INS_stats, INS_score, INS_ship, INS_bullets_group, INS_enemy_group, INS_play_button)    


if (__name__ == "__main__"):
    start_game()
